package com.atguigu.gmall.pms.service.impl;

import com.atguigu.gmall.pms.entity.SkuAttrValueEntity;
import com.atguigu.gmall.pms.entity.SkuImagesEntity;
import com.atguigu.gmall.pms.feign.GmallSmsClient;
import com.atguigu.gmall.pms.service.SkuAttrValueService;
import com.atguigu.gmall.pms.service.SkuImagesService;
import com.atguigu.gmall.pms.vo.SkuVo;
import com.atguigu.gmall.pms.vo.SpuVo;
import com.atguigu.gmall.sms.vo.SkuSaleInfoVo;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

import java.lang.invoke.LambdaMetafactory;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.atguigu.gmall.common.bean.PageResultVo;
import com.atguigu.gmall.common.bean.PageParamVo;

import com.atguigu.gmall.pms.mapper.SkuMapper;
import com.atguigu.gmall.pms.entity.SkuEntity;
import com.atguigu.gmall.pms.service.SkuService;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;


@Service("skuService")
public class SkuServiceImpl extends ServiceImpl<SkuMapper, SkuEntity> implements SkuService {


    @Autowired
    private SkuImagesService skuImagesService;

    @Autowired
    private SkuAttrValueService skuAttrValueService;


    //@Qualifier("sms-service")
    @Autowired
    private GmallSmsClient gmallSmsClient;//这里报红没事，如果加了@Qualifier才会报错，就这样就行了


    @Override
    public PageResultVo queryPage(PageParamVo paramVo) {
        IPage<SkuEntity> page = this.page(
                paramVo.getPage(),
                new QueryWrapper<SkuEntity>()
        );

        return new PageResultVo(page);
    }

    @Override
    public List<SkuEntity> querySkuBySpu(Long spuId) {
        LambdaQueryWrapper<SkuEntity> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(SkuEntity::getSpuId,spuId);
        return this.list(wrapper);
    }

    //4.保存到sku, sku_images, sku_attr_value, sku_bounds, sku_full_reduction, sku_ladder
    @Override
    @Transactional
    public void saveSkus(SpuVo spuVo, Long spuId, String name, Long brandId, Long categoryId) {
        List<SkuVo> skuVos = spuVo.getSkus();
        for (SkuVo skuVo : skuVos) {
            //4.1保存到sku表
            SkuEntity skuEntity = new SkuEntity();
            BeanUtils.copyProperties(skuVo, skuEntity);
            skuEntity.setSpuId(spuId);
            skuEntity.setName(name);
            skuEntity.setBrandId(brandId);
            skuEntity.setCategoryId(categoryId);
            List<String> images = skuVo.getImages();
            if (!CollectionUtils.isEmpty(images)) {
                skuEntity.setDefaultImage(images.get(0));//使用第一张作为默认图片
            }
            this.save(skuEntity);
            Long skuId = skuEntity.getId();

            //4.2保存到sku_images
            if (!CollectionUtils.isEmpty(images)) {
                List<SkuImagesEntity> skuImagesEntities = images.stream().map(skuImage -> {
                    SkuImagesEntity skuImagesEntity = new SkuImagesEntity();
                    skuImagesEntity.setSkuId(skuId);
                    skuImagesEntity.setUrl(skuImage);
                    skuImagesEntity.setSort(0);
                    skuImagesEntity.setDefaultStatus(skuImage.equals(skuEntity.getDefaultImage()) ? 1 : 0);
                    return skuImagesEntity;
                }).collect(Collectors.toList());
                skuImagesService.saveBatch(skuImagesEntities);
            }

            //4.3保存到sku_attr_value
            List<SkuAttrValueEntity> skuAttrValueEntities = skuVo.getSaleAttrs();
            skuAttrValueEntities.forEach(skuAttrValueEntity -> {
                skuAttrValueEntity.setSkuId(skuId);
                skuAttrValueEntity.setSort(0);
            });
            skuAttrValueService.saveBatch(skuAttrValueEntities);

            //4.4保存到sku_bounds(满减), sku_full_reduction(积分), sku_ladder(折扣)，远程访问sms才能做到。
            SkuSaleInfoVo skuSaleInfoVo = new SkuSaleInfoVo();
            skuSaleInfoVo.setSkuId(skuId);
            BeanUtils.copyProperties(skuVo,skuSaleInfoVo);
            gmallSmsClient.saveSkuSaleInfo(skuSaleInfoVo);
        }
    }

}